#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
// assert(x)的作用是，如果x为假，则报错并终止程序运行

// 返回n的降k阶乘：n*(n-1)*(n-2)*...*(n-k+1)
int falling(int n, int k)
{
}
void check1()
{
	assert(falling(5, 3) == 60);
	assert(falling(5, 5) == 120);
	assert(falling(5, 0) == 1);
}

// 判断n是否为素数，是素数返回1，否则返回0
int isPrime(int n)
{
}
void check2()
{
	assert(isPrime(2) == 1);
	assert(isPrime(4) == 0);
	assert(isPrime(25) == 0);
	assert(isPrime(31) == 1);
	assert(isPrime(91) == 0);
	assert(isPrime(97) == 1);
}

// 矩阵乘，将A*B的结果存入C中，A、B、C均为3*3的二维数组
void matrixMul(int A[3][3], int B[3][3], int C[3][3])
{
}

void check3()
{
	int A[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
	int B[3][3] = {{10, 12, 14}, {16, 18, 20}, {22, 24, 26}};
	int C[3][3]; // 注意：C中的元素未初始化
	int D[3][3] = {{108, 120, 132}, {252, 282, 312}, {396, 444, 492}};// A*B的正确结果
	matrixMul(A, B, C);
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; ++j)
			assert(C[i][j] == D[i][j]);
}



// 扩展欧几里得算法，计算a*x+b*y=gcd(a,b)的一组解
// 返回gcd(a,b)，将x、y的值通过指针参数返回
int exgcd(int a, int b, int *x, int *y)
{
}

void check4()
{
	int x, y;
	assert(exgcd(3, 5, &x, &y) == 1);
	assert(x == 2);
	assert(y == -1);
	assert(exgcd(4, 6, &x, &y) == 2);
	assert(x == -1);
	assert(y == 1);
}

int main()
{
	// 测试代码，可以先一个一个写，然后逐个check
	check1();
	check2();
	check3();
	check4();
	puts("Tests passed!");
	return 0;
}